(function(){
	// function Test(constructor:any){
	// 	return class extends constructor {
	// 		constructor(...args){
	// 			super(...args)
	// 			this.abc = 1111
	// 		}
	// 	}
	// }
	
	// function Test2 (target: any, key: string): any {
	// 	target.aaa || (target.aaa = new Set());
	// 	target.aaa.add(key)
	// }
	
	// function Type (...types:Function[]): any {
	// 	return function(target: any, key: string){
	// 		target.bbb || (target.bbb = new Map());
	// 		target.bbb.set(key,types)
	// 	}
	// }
	function test2(b:any) {
	    console.log("b", b)
	    return (fn:any, key:any, proto:any) => {
	        console.log("test2", fn, key, proto)
	    }
	}
	
	function Test1(constructor:Function){
		// console.log("a",a)
		console.log('constructor.prototype',constructor.prototype)
		console.log('constructor.name',constructor.name)
		for(let method in constructor.prototype){
			console.log(method)
		}
		
	}
	
	// 证明 方法装饰器先执行，类装饰器后执行。所以可以在类装饰器中，获知哪些方法使用了哪些装饰器。
	
	@Test1
	class A{
		// @Test2
		// @Type(String,Number)
		// a?:string
		// @Test2
		// b?:string
		// constructor({a,b}:any){
		// 	this.a = a
		// 	this.b = b
		// }
		@test2(11)
		fn1(a){
			console.log("fn1",a)
		}
		fn2(a){
			console.log("fn2",a)
		}
		// static fn3(){
			
		// }
		// private fn4(){
			
		// }
	}
	
	// var a = new A({a:"1231"})
	// var a = new A()
	// console.log("===a.prototype",a.constructor.prototype)
	
	// console.log("a=",a)
	// console.log("a.b=",a.b)
	// console.log("a.aaa",a.aaa)
	
})()